﻿Option Strict On

Imports System.Data
Imports System.Data.Common
Imports DbDataLib
Imports KUeLib.Vertraege

Namespace Services

    Public Class VertragsDataService
        Inherits ServiceDefinitions.VertragsDataService

        Public Sub New(ByVal dataService As DbDataService)
            MyBase.New(dataService)
        End Sub

        Protected Function GetLastInsertId() As Integer
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim sb As New Text.StringBuilder

            sb.AppendLine("SELECT last_insert_id()")

            cmd.CommandText = sb.ToString()

            Return CInt(_dataService.ExecuteScalar(cmd))
        End Function

        Public Overrides Function Save(ByVal vertrag As Vertrag) As Integer
            If Update(vertrag) <= 0 Then _
                Insert(vertrag) : vertrag.Id = GetLastInsertId()
            Return vertrag.Id
        End Function

        Protected Function Insert(ByVal vertrag As Vertrag) As Integer
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim sb As New Text.StringBuilder

            sb.AppendLine("INSERT INTO vertraege(v_bezeichnung, v_partner, v_partner_details, v_wiedervorlage, v_wiedervorlage_datum, ")
            sb.AppendLine("v_status, v_inhalt, v_abschlussdatum, v_ablaufdatum, v_kuendigungsdatum, v_zahlungsintervall, v_betrag ) ")
            sb.AppendLine("VALUES(@p_bezeichnung, @p_partner, @p_partner_details, @p_wiedervorlage, @p_wiedervorlage_datum, ")
            sb.AppendLine("@p_status, @p_inhalt, @p_abschlussdatum, @p_ablaufdatum, @p_kuendigungsdatum, @p_zahlungsintervall, ")
            sb.AppendLine("@p_betrag ) ")

            cmd.CommandText = sb.ToString()

            cmd.Parameters.Add(_dataService.CreateParameter("p_bezeichnung", DbType.String, vertrag.Bezeichnung))
            cmd.Parameters.Add(_dataService.CreateParameter("p_partner", DbType.String, vertrag.Partner))
            cmd.Parameters.Add(_dataService.CreateParameter("p_partner_details", DbType.String, vertrag.PartnerDetails))
            cmd.Parameters.Add(_dataService.CreateParameter("p_wiedervorlage", DbType.Int16, Utils.Boolean2Integer(vertrag.Wiedervorlage)))
            cmd.Parameters.Add(_dataService.CreateParameter("p_wiedervorlage_datum", DbType.Date, vertrag.WiedervorlageDatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_status", DbType.String, vertrag.Status))
            cmd.Parameters.Add(_dataService.CreateParameter("p_inhalt", DbType.String, vertrag.Inhalt))
            cmd.Parameters.Add(_dataService.CreateParameter("p_abschlussdatum", DbType.Date, vertrag.Abschlussdatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_ablaufdatum", DbType.Date, vertrag.Ablaufdatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_kuendigungsdatum", DbType.Date, vertrag.Kuendigungsdatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_zahlungsintervall", DbType.String, vertrag.Zahlungsintervall))
            cmd.Parameters.Add(_dataService.CreateParameter("p_betrag", DbType.Double, vertrag.Betrag))

            Return _dataService.ExecuteNonQuery(cmd)
        End Function

        Protected Function Update(ByVal vertrag As Vertrag) As Integer
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim sb As New Text.StringBuilder

            'sb.AppendLine("INSERT INTO vertraege(v_bezeichnung, v_partner, v_partner_details, v_wiedervorlage, v_wiedervorlage_datum, ")
            'sb.AppendLine("v_status, v_inhalt, v_abschlussdatum, v_ablaufdatum, v_kuendigungsdatum, v_zahlungsintervall, v_betrag ) ")
            'sb.AppendLine("VALUES(@p_bezeichnung, @p_partner, @p_partner_details, @p_wiedervorlage, @p_wiedervorlage_datum, ")
            'sb.AppendLine("@p_status, @p_inhalt, @p_abschlussdatum, @p_ablaufdatum, @p_kuendigungsdatum, @p_zahlungsintervall, ")
            'sb.AppendLine("@p_betrag ) ")

            sb.AppendLine("UPDATE vertraege SET v_bezeichnung = @p_bezeichnung, ")
            sb.AppendLine("                     v_partner = @p_partner, ")
            sb.AppendLine("                     v_partner_details = @p_partner_details, ")
            sb.AppendLine("                     v_wiedervorlage = @p_wiedervorlage, ")
            sb.AppendLine("                     v_wiedervorlage_datum = @p_wiedervorlage_datum, ")
            sb.AppendLine("                     v_status = @p_status, ")
            sb.AppendLine("                     v_inhalt = @p_inhalt, ")
            sb.AppendLine("                     v_abschlussdatum = @p_abschlussdatum, ")
            sb.AppendLine("                     v_ablaufdatum = @p_ablaufdatum, ")
            sb.AppendLine("                     v_kuendigungsdatum = @p_kuendigungsdatum, ")
            sb.AppendLine("                     v_zahlungsintervall = @p_zahlungsintervall, ")
            sb.AppendLine("                     v_betrag = @p_betrag ")
            sb.AppendLine(" WHERE v_id = @p_id ")

            cmd.CommandText = sb.ToString()

            cmd.Parameters.Add(_dataService.CreateParameter("p_bezeichnung", DbType.String, vertrag.Bezeichnung))
            cmd.Parameters.Add(_dataService.CreateParameter("p_partner", DbType.String, vertrag.Partner))
            cmd.Parameters.Add(_dataService.CreateParameter("p_partner_details", DbType.String, vertrag.PartnerDetails))
            cmd.Parameters.Add(_dataService.CreateParameter("p_wiedervorlage", DbType.Int16, Utils.Boolean2Integer(vertrag.Wiedervorlage)))
            cmd.Parameters.Add(_dataService.CreateParameter("p_wiedervorlage_datum", DbType.Date, vertrag.WiedervorlageDatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_status", DbType.String, vertrag.Status))
            cmd.Parameters.Add(_dataService.CreateParameter("p_inhalt", DbType.String, vertrag.Inhalt))
            cmd.Parameters.Add(_dataService.CreateParameter("p_abschlussdatum", DbType.Date, vertrag.Abschlussdatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_ablaufdatum", DbType.Date, vertrag.Ablaufdatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_kuendigungsdatum", DbType.Date, vertrag.Kuendigungsdatum))
            cmd.Parameters.Add(_dataService.CreateParameter("p_zahlungsintervall", DbType.String, vertrag.Zahlungsintervall))
            cmd.Parameters.Add(_dataService.CreateParameter("p_betrag", DbType.Double, vertrag.Betrag))
            cmd.Parameters.Add(_dataService.CreateParameter("p_id", DbType.Int32, vertrag.Id))

            Return _dataService.ExecuteNonQuery(cmd)
        End Function

        Public Overrides Function GetVertragById(ByVal vertragId As Integer) As Vertrag
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim sb As New Text.StringBuilder
            Dim v As Vertrag = Nothing
            Dim dt As DataTable

            sb.AppendLine("SELECT * FROM vertraege WHERE v_id = @p_id ")

            cmd.CommandText = sb.ToString()
            cmd.Parameters.Add(_dataService.CreateParameter("p_id", DbType.Int32, vertragId))

            dt = _dataService.GetDataTable(cmd)

            For i As Integer = 0 To dt.Rows.Count - 1 Step 1

                v = New Vertrag

                v.Id = CInt(Utils.DbNull2Nothing(dt.Rows(i).Item("v_id")))
                v.Bezeichnung = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_bezeichnung")))
                v.Partner = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_partner")))
                v.PartnerDetails = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_partner_details")))
                v.Wiedervorlage = Utils.Integer2Boolean(CInt(Utils.DbNull2Nothing(dt.Rows(i).Item("v_wiedervorlage"))))
                v.WiedervorlageDatum = CDate(Utils.DbNull2Nothing(dt.Rows(i).Item("v_wiedervorlage_datum")))
                v.Status = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_status")))
                v.Inhalt = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_inhalt")))
                v.Abschlussdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i).Item("v_abschlussdatum")))
                v.Ablaufdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i).Item("v_ablaufdatum")))
                v.Kuendigungsdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i).Item("v_kuendigungsdatum")))
                v.Zahlungsintervall = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_zahlungsintervall")))
                v.Betrag = CDbl(Utils.DbNull2Nothing(dt.Rows(i).Item("v_betrag")))

            Next

            Return v
        End Function

        Public Overrides Function GetVertraegeForComboBoxSelection() As List(Of Vertrag)
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim sb As New Text.StringBuilder
            Dim lov As New List(Of Vertrag)
            Dim dt As DataTable

            sb.AppendLine("SELECT v_id, v_bezeichnung FROM vertraege ORDER BY v_bezeichnung ")

            cmd.CommandText = sb.ToString()

            dt = _dataService.GetDataTable(cmd)

            For i As Integer = 0 To dt.Rows.Count - 1 Step 1

                Dim tv As New Vertrag

                tv.Id = CInt(Utils.DbNull2Nothing(dt.Rows(i).Item("v_id")))
                tv.Bezeichnung = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_bezeichnung")))

                lov.Add(tv)
            Next

            Return lov

        End Function

        Public Overrides Function GetVertraege() As List(Of Vertrag)
            Dim cmd As DbCommand = _dataService.Factory.CreateCommand()
            Dim sb As New Text.StringBuilder
            Dim lov As New List(Of Vertrag)
            Dim dt As DataTable

            sb.AppendLine("SELECT * FROM vertraege ORDER BY v_bezeichnung")

            cmd.CommandText = sb.ToString()

            dt = _dataService.GetDataTable(cmd)

            For i As Integer = 0 To dt.Rows.Count - 1 Step 1

                Dim tv As New Vertrag

                tv.Id = CInt(Utils.DbNull2Nothing(dt.Rows(i).Item("v_id")))
                tv.Bezeichnung = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_bezeichnung")))
                tv.Partner = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_partner")))
                tv.PartnerDetails = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_partner_details")))
                tv.Wiedervorlage = Utils.Integer2Boolean(CInt(Utils.DbNull2Nothing(dt.Rows(i).Item("v_wiedervorlage"))))
                tv.WiedervorlageDatum = CDate(Utils.DbNull2Nothing(dt.Rows(i).Item("v_wiedervorlage_datum")))
                tv.Status = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_status")))
                tv.Inhalt = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_inhalt")))
                tv.Abschlussdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i).Item("v_abschlussdatum")))
                tv.Ablaufdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i).Item("v_ablaufdatum")))
                tv.Kuendigungsdatum = CDate(Utils.DbNull2Nothing(dt.Rows(i).Item("v_kuendigungsdatum")))
                tv.Zahlungsintervall = CStr(Utils.DbNull2Nothing(dt.Rows(i).Item("v_zahlungsintervall")))
                tv.Betrag = CDbl(Utils.DbNull2Nothing(dt.Rows(i).Item("v_betrag")))

                lov.Add(tv)
            Next

            Return lov
        End Function

    End Class

End Namespace